/**
 * @copyright Copyright (c) 2024 广州中海达卫星导航股份有限公司
 * @file camera_type.h
 * @brief
 * @author 嵌入式软件部--黄宗强
 * @date 2024-08-23
 * @version V1.0.0
 * @details 定义摄像头相关参数
 * @since
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-08-23 <td>v1.0     <td>XXX     <td>内容
 * </table>
 */
#ifndef __CAMERA_TYPE_H__
#define __CAMERA_TYPE_H__

#include "cbb_common.h"
#include "cbb_type.h"
#include <iostream>
#include <string>

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

typedef enum {
    CAMERA_FMT_YUYV = 0x01 << 0,
    CAMERA_FMT_H264 = 0x01 << 1,
    CAMERA_FMT_JPG = 0x01 << 2,
} CameraFormatE_t; //! 摄像头图像格式

typedef enum {
    CAMERA_ID_LEFT = 0,  // 左视摄像头
    CAMERA_ID_MID = 1,   //! 前视摄像头，即中间的那一个
    CAMERA_ID_RIGHT = 2, //! 右视摄像头
} CameraIdE_t;           //! 摄像ID类型

typedef enum {
    CAMERA_TARN_PRO_UDP = 0,
    CAMERA_TRAN_PRO_UDT = 1, //! UDT协议，目前用不到
} CameraTranProtocolE_t;     //! 摄像头数据传输协议

typedef enum {
    CAMERA_OPT_START = 0,  //! 开始
    CAMERA_OPT_STOP = 1,   //! 停止
    CAMERA_OPT_DELETE = 2, //! 删除
} CameraCommOptE_t;        // ！摄像头通用操作
typedef enum {
    CAMERA_TRAN_TO_APP = 0,  // 往APP传输
    CAMERA_TRAN_TO_SLAM = 1, // 用于点云赋色，Slam RTK产品传输给slam_manage进程，Slam Pro产品传输给外部的RV1126芯片
} CameraTranDirectionE_t;    //! 摄像头数据传输方向
typedef struct {
    hd_u8_t camera_id;    //! 摄像头ID,参考CameraIdE_t
    hd_u32_t format_app;  //! 传输给APP采用的编码格式，参考 CameraFormatE_t
    hd_f32_t format_slam; //! 传输给Slam进行点云赋色采用的编码格式,参考 CameraFormatE_t
    hd_u32_t width;       //! 分辨率
    hd_u32_t height;      //! 分辨率；
    hd_s16_t rotation;    // 旋转角度 0-0 1-90 2-180 3-270
} CameraConf_t;           //! 摄像头参数配置

typedef struct {
    hd_u8_t camera_id; //! 摄像头ID,参考CameraIdE_t
    hd_u8_t opt;       //! 操作，参考 CameraCommOptE_t，特别注意，不协议不支持删除操作，仅支持 CAMERA_OPT_START 或 CAMERA_OPT_STOP
    hd_u8_t direction; //! 传输方向,参考 CameraTranDirectionE_t
    hd_u8_t protocol;  //! 传输协议，参考CameraTranProtocolE_t
    std::string ip;
    hd_s16_t port;
} CameraTranConf_t; //! 摄像头传输配置,摄像头进程作为"客户端"

typedef struct {
    hd_u8_t camera_id;     //! 摄像头ID,参考CameraIdE_t
    hd_u8_t opt;           //! 操作，参考 CameraCommOptE_t
    std::string file_name; //! 文件绝对路径+名称，例如/mnt/demo_pro/demo_task/camera/mid/camera1.jpg
} CameraStoreOpt_t;        //! 摄像头数据存储操作

typedef struct {

    hd_u32_t total;
    hd_u8_t data[1300];
    hd_u16_t data_len;
    hd_u32_t cnt;       // 数据包计数，当cnt等于total时，代表已完成以帧数据的发送和接收
    hd_u64_t timestamp; //! 相片时间戳
} CameraTranPacket_t;   //! 摄像头传输数据包, 目前仅用于 CAMERA_TRAN_TO_SLAM，内部传输。

#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#endif // __CAMERA_TYPE_H